<?php
/**
 * Klasse zur Auflistung von Datensaetzen
 *
 * @author		Joachim Ruf
 * @copyright	Copyright (c) 2003-2010 Loresoft Software (http://www.loresoft.de)
 *
 * */


Class Yapary_Listing_Object_Listing
{
    const NEWLINE = "\n";

    /** @var $arrData array */
    private $arrData        = array();
    /** @var $arrConfig array */
    private $arrConfig      = array();
    /** @var $resultsPerPage int */
    private $resultsPerPage = NULL;



    /**
     * Callback-Template
     * @param object $object	: Aktuelles Objekt
     * @param mixed $curVal		: Aktuell eingetragener Wert
     * */
    /*
    public function callbackTemplate ($object, $val) {
		return $object->method();
    }
	*/


    /**
     * @param Array[Object] $arrObject	: Object-Array mit allen Datensaetzen
     * @param int $_resultsPerPage		: Gruppierungsgroesse eines auszugebenden Datensatzes
     * */
    function __construct (array $_arrObject, $_resultsPerPage = 20)
    {
        if (count($_arrObject) == 0) {
            trigger_error('No Data available', E_USER_ERROR);
        }
        if (!is_numeric($_resultsPerPage)) {
            trigger_error('Invalid numeriv value for parameter _resultsPerPage', E_USER_ERROR);
        }

        $this->arrData = $_arrObject;
        $this->resultsPerPage = $_resultsPerPage;
    }


    /**
     * Definiert eine anzuzeugende Spalte
     * @param string $_desc					: Auszugebender Beschreibungstext fuer diese Spalte
     * @param string $_methodName			: Name der auszufuehreden Methode der im Konstruktor uebergebenen Klasse
     * @param object $_callbackClassName	: Als Callback auszufuehrenden Klasse
     * @param string $_callbackMethodame	: Name der als Callback auszufuehrtenden Klassenmethode
     * */
    public function add ($_desc, $_methodName, $_callbackClassName = NULL, $_callbackMethodName = NULL)
    {
//        if (!method_exists($this->arrData[0], $_methodName)) {
//            trigger_error('Method <b>'.$_methodName.'</b> does not exists', E_USER_ERROR);
//        }
        if ($_callbackMethodName != NULL && !method_exists($_callbackClassName, $_callbackMethodName)) {
            trigger_error('Function <b>'.$_callbackClassName.'->'.$_callbackMethodName.'</b> does not exists', E_USER_ERROR);
        }

        $this->arrConfig[] = array('desc'              => $_desc,
                                   'methodName'        => $_methodName,
                                   'callbackClassName'  => $_callbackClassName,
                                   'callbackMethodName' => $_callbackMethodName);
    }


    /**
     * Ermittelt die Anzahl verfuegbarer Seiten
     * @return int
     * */
    public function getPageCount () {
        return ceil(count($this->arrData)/$this->resultsPerPage);
    }

    /**
     * Gibt die Liste aus
     * @param int $page[0]	: auszugebender Index
     * @param int $rows[2]	: Anzahl der zu unterteilenden rows (siehe code)
     * @return string
     * */
    public function display (Yapary_Listing_Object_IViewer $viewer, $page = 1)
    {
        $arr       = array();
        $result    = '';
        $resultTmp = '';
        $i         = 0;

        if (count($this->arrConfig) == 0) {
            trigger_error('missing config data', E_USER_ERROR);
            return '';
        }

        // Datensaetze
        while (list($i, $object) = each($this->arrData)) {
            if (!($i >= $this->resultsPerPage*($page-1) &&
                  $i+1 <= $this->resultsPerPage*($page))) {
                continue;
            }

            $arrTmp = array();
            foreach ($this->arrConfig as $key => $val) {
                $methodName = $val['methodName'];
                $callbackClassName = $val['callbackClassName'];
                $callbackMethodName = $val['callbackMethodName'];

                if ($callbackMethodName == NULL) {
                    $arrTmp[$val['desc']] = $object->$methodName;
                } else {
                    $arrTmp[$val['desc']] = $callbackClassName->$callbackMethodName($object, $object->$methodName);
                }
            }

            $arr[] = $arrTmp;
        }
        reset($this->arrData);

        return $viewer->display($arr);
    }


}


?>